package br.com.imob.modelo;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author Gilton Nascimento
 */
@Entity
@Table(name = "\"EMPRESA\"", catalog = "imob", schema = "public", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"cnpj"})})
@NamedQueries({
    @NamedQuery(name = "Empresa.findAll", query = "SELECT e FROM Empresa e"),
    @NamedQuery(name = "Empresa.findByEmpresaId", query = "SELECT e FROM Empresa e WHERE e.empresaId = :empresaId"),
    
    @NamedQuery(name = "Empresa.findByFantasia", query = "SELECT e FROM Empresa e WHERE e.fantasia = :fantasia"),
    @NamedQuery(name = "Empresa.findLikeByFantasia", query = "SELECT e FROM Empresa e WHERE e.fantasia Like :fantasia"),
    
    @NamedQuery(name = "Empresa.findByRazaoSocial", query = "SELECT e FROM Empresa e WHERE e.razaoSocial = :razaoSocial"),
    @NamedQuery(name = "Empresa.findLikeByRazaoSocial", query = "SELECT e FROM Empresa e WHERE e.razaoSocial Like :razaoSocial"),
    
    @NamedQuery(name = "Empresa.findByInscricaoEstado", query = "SELECT e FROM Empresa e WHERE e.inscricaoEstado = :inscricaoEstado"),
    @NamedQuery(name = "Empresa.findLikeByInscricaoEstado", query = "SELECT e FROM Empresa e WHERE e.inscricaoEstado Like :inscricaoEstado"),
    
    @NamedQuery(name = "Empresa.findByCnpj", query = "SELECT e FROM Empresa e WHERE e.cnpj = :cnpj"),
    @NamedQuery(name = "Empresa.findLikeByCnpj", query = "SELECT e FROM Empresa e WHERE e.cnpj Like :cnpj")
    })
    
public class Empresa implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
//  <editor-fold defaultstate="collapsed" desc="Geradores de Sequencias">
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_STORE")
    @SequenceGenerator(name = "SEQ_STORE", sequenceName = "next_empresa")// </editor-fold>
    @Basic(optional = false)
    @Column(name = "empresa_id", nullable = false)
    private Integer empresaId;
    
    @Column(name = "fantasia", length = 2147483647)
    private String fantasia;
    
    @Column(name = "razao_social", length = 2147483647)
    private String razaoSocial;
    
    @Column(name = "inscricao_estado", length = 20)
    private String inscricaoEstado;
    
    @Basic(optional = false)
    @Column(name = "cnpj", nullable = false, length = 20)
    private String cnpj;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "empresa", fetch = FetchType.LAZY)
    private List<AcompanhamentoJuridico> acompanhamentoJuridicoList;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "empresa", fetch = FetchType.LAZY)
    private List<Conta> contaList;
    
    @JoinColumn(name = "obra_id", referencedColumnName = "obra_id")
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Obra obra;
    
    @JoinColumn(name = "login_id", referencedColumnName = "login_id", nullable = false)
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Login login;
    
    @JoinColumn(name = "endereco_id", referencedColumnName = "endereco_id", nullable = false)
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Endereco endereco;
    
    @JoinColumn(name = "funcionario_id", referencedColumnName = "corretor_id")
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Corretor corretor;
    
    @JoinColumn(name = "contato2_id", referencedColumnName = "contato_id")
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL )
    private Contato contato;
    
    @JoinColumn(name = "contato_id", referencedColumnName = "contato_id", nullable = false)
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Contato contato1;
    
    @JoinColumn(name = "emp_construtora_id", referencedColumnName = "construtora_id")
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Construtora construtora;
    
    @JoinColumn(name = "agenda_id", referencedColumnName = "agenda_id")
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Agenda agenda;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "empresa", fetch = FetchType.LAZY)
    private List<Relacionamento> relacionamentoList;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "empresa1", fetch = FetchType.LAZY)
    private List<Relacionamento> relacionamentoList1;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "empresa", fetch = FetchType.LAZY)
    private List<Grupo> grupoList;
    
    @OneToMany(mappedBy = "empresa", fetch = FetchType.LAZY)
    private List<Imovel> imovelList;

    public Empresa() { }

    public Empresa(Integer empresaId) { this.empresaId = empresaId; }

    public Empresa(Integer empresaId, String cnpj) {
        this.empresaId = empresaId;
        this.cnpj = cnpj;
    }
    
    public Empresa(String tpStr, String arg) {
    	if("fantasia".equalsIgnoreCase(tpStr)) 
    		fantasia = arg;
    	if("razao social".equalsIgnoreCase(tpStr)) 
    		razaoSocial = arg;
    	if( "inscricao estado".equalsIgnoreCase(tpStr)  || tpStr.startsWith("inscricao ") ) 
    		inscricaoEstado = arg;
    	if("cnpj".equalsIgnoreCase(tpStr)) 
    		cnpj = arg;
    }
    
    public Empresa(int id, String tpStr, String arg) {
    	this(tpStr, arg);
    	empresaId = id;
    }
    
    public Empresa(String fantasy, String rSocial, String iEstadual, String cnpj_) {
    	fantasia = fantasy;
    	razaoSocial = rSocial;
    	inscricaoEstado = iEstadual;
    	cnpj = cnpj_;
    }
    
    public Empresa(int id, String fantasy, String rSocial, String iEstadual, String cnpj_) {
    	this(fantasy, rSocial, iEstadual, cnpj_);
    	empresaId = id;
    }


//    Getts and Setts
    public Integer getEmpresaId() {
        return empresaId;
    }

    public void setEmpresaId(Integer empresaId) {
        this.empresaId = empresaId;
    }

    public String getFantasia() {
        return fantasia;
    }

    public void setFantasia(String fantasia) {
        this.fantasia = fantasia;
    }

    public String getRazaoSocial() {
        return razaoSocial;
    }

    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }

    public String getInscricaoEstado() {
        return inscricaoEstado;
    }

    public void setInscricaoEstado(String inscricaoEstado) {
        this.inscricaoEstado = inscricaoEstado;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

    public List<AcompanhamentoJuridico> getAcompanhamentoJuridicoList() {
        return acompanhamentoJuridicoList;
    }

    public void setAcompanhamentoJuridicoList(List<AcompanhamentoJuridico> acompanhamentoJuridicoList) {
        this.acompanhamentoJuridicoList = acompanhamentoJuridicoList;
    }

    public List<Conta> getContaList() {
        return contaList;
    }

    public void setContaList(List<Conta> contaList) {
        this.contaList = contaList;
    }

    public Obra getObra() {
        return obra;
    }

    public void setObra(Obra obra) {
        this.obra = obra;
    }

    public Login getLogin() {
        return login;
    }

    public void setLogin(Login login) {
        this.login = login;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public Corretor getCorretor() {
        return corretor;
    }

    public void setCorretor(Corretor corretor) {
        this.corretor = corretor;
    }

    public Contato getContato1() {
        return contato1;
    }

    public void setContato1(Contato contato) {
        this.contato1 = contato;
    }

    public Contato getContato() {
        return contato;
    }

    public void setContato(Contato contato1) {
        this.contato = contato1;
    }

    public Construtora getConstrutora() {
        return construtora;
    }

    public void setConstrutora(Construtora construtora) {
        this.construtora = construtora;
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }

    public List<Relacionamento> getRelacionamentoList() {
        return relacionamentoList;
    }

    public void setRelacionamentoList(List<Relacionamento> relacionamentoList) {
        this.relacionamentoList = relacionamentoList;
    }

    public List<Relacionamento> getRelacionamentoList1() {
        return relacionamentoList1;
    }

    public void setRelacionamentoList1(List<Relacionamento> relacionamentoList1) {
        this.relacionamentoList1 = relacionamentoList1;
    }

    public List<Grupo> getGrupoList() {
        return grupoList;
    }

    public void setGrupoList(List<Grupo> grupoList) {
        this.grupoList = grupoList;
    }

    public List<Imovel> getImovelList() {
        return imovelList;
    }

    public void setImovelList(List<Imovel> imovelList) {
        this.imovelList = imovelList;
    }
    
    public Object[] getValues() {
    	Object[] values = { empresaId, fantasia, razaoSocial, cnpj, inscricaoEstado };
    	return values;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (empresaId != null ? empresaId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Empresa)) {
            return false;
        }
        Empresa other = (Empresa) object;
        if ((this.empresaId == null && other.empresaId != null) || (this.empresaId != null && !this.empresaId.equals(other.empresaId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.imob.modelo.Empresa[empresaId=" + empresaId + "]";
    }

}
